home *** CD-ROM | disk | FTP | other *** search
- #define CONSOLE 1
- #define TEST 0
-
- /* /// CD-DA利用関数 /// */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <cdrfrb.h>
- #include <snd.h>
- #include "cdp.h"
-
- /* グローバル変数 */
-
- /* CD時間情報の構造体 TIMEADRS */
- struct TIMEADRS cdtim; /* ディスク演奏終了時刻 */
- struct TIMEADRS trktim[99]; /* 各トラック毎の演奏開始時刻 */
-
- int devno = 0; /* ドライブナンバ */
- int cdtype = 0; /* CDディスクタイプ */
- int sttrk = 0; /* 先頭曲ナンバ */
- int endtrk = 0; /* 最終曲ナンバ */
-
- int cdpstat = 10000; /* CDplayステイタス
- ( cdp.cの関数で管理し、ハード情報に直接依存しない)
- (演奏 => 曲番号, 一時停止 => マイナス値 ,ディスク情報未取得 =>±10000 ) */
-
- /* cdr_mphase 関連 */
- int stat = 0; /* CD演奏(1)・非演奏(一時停止含む)(0) */
- int nowmusno = 0; /* 現在演奏中の曲番号 */
- struct TIMEADRS intrktim; /* トラック内演奏時刻 */
- struct TIMEADRS indsktim; /* ディスク内演奏時刻 */
-
-
- /* CDディスク情報の取得 */
-
- int cdp_diskinf()
- {
- int ret;
- #if CONSOLE
- printf("CDディスク情報を読み取ります\n");
- #endif
- ret = cdr_cdinfo( devno, &cdtype, &sttrk, &endtrk, trktim, &cdtim );
- if( cdtype == 3 )
- { sttrk = 2; }
- if( ret == 0 )
- {
- cdpstat = 0; /* 一度cdpstatの値を停止中扱いにする */
- #if CONSOLE
- printf("ディスクタイプ = %d\n", cdtype);
- printf("先頭トラック(曲)番号 = %d\n", sttrk);
- printf("最終トラック(曲)番号 = %d\n", endtrk);
- printf("ディスク内演奏時間(分) = %d\n", cdtim.min);
- printf("ディスク内演奏時間(秒) = %d\n", cdtim.sec);
- printf("ディスク内演奏時間(フレーム) = %d\n", cdtim.frame);
- #endif
- }
- #if CONSOLE
- else
- {
- printf("エラーです!!ディスク情報が読めませんでした。\n");
- }
- #endif
- return( ret );
- }
-
-
- /* CD演奏状態読み取り */
-
- int cdp_playinf()
- {
- int ret;
- ret = cdr_mphase( devno, &stat, &nowmusno, &intrktim, &indsktim );
- if( ret == CDERR7 )
- {
- if( stat == 0 )
- {
- cdp_diskinf();
- }
- else
- {
- cdpstat = 10000;
- }
- }
- #if TEST
- printf("cdst=%d ,mno=%d ,st=%d ,m/s/f=%d %d %d\n",
- cdpstat, nowmusno, stat, intrktim.min, intrktim.sec, intrktim.frame);
- #endif
- return( ret );
- }
-
-
- /* CD演奏 (開始) */
-
- void endtim(char,char,char,char *,char *,char *);
-
- /* 演奏開始 (時刻指定) */
- int cdp_tstart( struct TIMEADRS begtim )
- { /* 終了時刻設定 */
- int ret;
- struct TIMEADRS fintim;
-
- endtim( cdtim.min, cdtim.sec, cdtim.frame,
- &fintim.min, &fintim.sec, &fintim.frame);
- #if CONSOLE
- printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
- #endif
- ret = cdr_mtplay( devno, &begtim, &fintim); /* 演奏指令 */
- if( ret == 0 )
- {
- cdp_playinf();
- cdpstat = nowmusno; /* cdpstat値に曲番号を設定 */
- }
- #if CONSOLE
- printf(" ret= 0x%x\n", ret);
- #endif
- return( ret );
- }
-
- /* 曲名指定 */
- int cdp_sstart( unsigned int song_num )
- {
- int ret;
- struct TIMEADRS sttim; /* 演奏開始時刻 (命令用) */
- struct TIMEADRS fintim; /* 演奏終了時刻 (命令用) */
-
- if( (song_num<sttrk) || (endtrk<song_num) )
- { /* 存在しない曲番号の場合はキャンセルする */
- #if CONSOLE
- printf(" No. %u : この番号の曲は存在しません\n", song_num);
- printf(" sttrk=%d song_num=%d endtrk=%d\n",sttrk,song_num,endtrk);
- #endif
- return(-1);
- }
- sttim.min = trktim[song_num-1].min; /* 開始時刻設定 */
- sttim.sec = trktim[song_num-1].sec;
- sttim.frame = trktim[song_num-1].frame;
- #if CONSOLE
- printf(" song_number = %d\n", song_num);
- printf(" sttim = %d %d %d \n", sttim.min, sttim.sec, sttim.frame);
- #endif
- if( song_num <= endtrk ) /* 終了時刻設定 */
- {
- endtim( cdtim.min, cdtim.sec, cdtim.frame,
- &fintim.min, &fintim.sec, &fintim.frame);
- #if CONSOLE
- printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
- #endif
- }
- else /* 終了時刻設定 (指定失敗の場合) */
- {
- #if CONSOLE
- printf(" song_num > endtrk !! ");
- #endif
- return(-1);
- }
- ret = cdr_mtplay( devno, &sttim, &fintim); /* 演奏指令 */
- if( ret == 0 )
- {
- cdpstat = song_num; /* cdpstat値を曲番号に設定 */
- }
- #if CONSOLE
- printf(" ret= 0x%x\n", ret);
- #endif
- return( ret );
- }
-
- /* 演奏終了時刻計算 */
- void endtim(char m, char s, char f, char *mi, char *se, char *fr)
- {
- /* 1分は60秒 ,1秒は75フレーム */
- int a;
-
- a = 4500*m + 75*s + f -1;
- *mi = a/4500;
- *se = ( a%4500 )/75;
- *fr = a%75;
- }
-
- /* 演奏開始 (局番絶対指定) */
- int cdp_go( unsigned int song_num ,char sw )
- {
- if( sw == 1 ) /* 演奏中割り込み可能指定の場合 */
- {
- if( stat == 1 ) { cdr_pause( devno ); }
-
- if( abs(cdpstat) == 10000 ) /* ディスク情報を未取得の場合 */
- {
- cdp_diskinf();
- }
- }
- int ret;
- #if CONSOLE
- printf("\n cdp_GO !! Next One => %d\n", song_num);
- #endif
- ret = cdp_sstart( song_num ); /* cdpstatはcdp_sstartで設定 */
- return( ret );
- }
-
- /* 演奏開始 (最初の曲) */
- int cdp_first_go()
- {
- int ret = -1;
- if( cdpstat == 0 ) /* 停止中の場合 */
- {
- #if CONSOLE
- printf("\n cdp_FIRST() ! Next One => %d\n", sttrk);
- #endif
- ret = cdp_sstart( sttrk ); /* cdpstatはcdp_sstartで設定 */
- }
- else if( cdpstat < 0 ) /* 一時停止中の場合 */
- {
- ret = cdp_cont();
- }
- return( ret );
- }
-
- int cdp_stop() /* 演奏中止 */
- {
- #if CONSOLE
- printf("\n cdp_STOP() !\n");
- #endif
- int ret;
- ret = cdr_mstop( devno );
- if( abs(cdpstat) == 10000 ) /* ディスク情報未取得の場合 */
- {
- ret = cdp_diskinf();
- }
- if( ret == 0 ) /* 正常動作した場合 */
- {
- cdpstat = 0;
- }
- return( ret );
- }
-
- /* 演奏中断 */
- int cdp_pause()
- {
- int ret;
- ret = cdr_pause( devno );
- if( ret == 0 || ret == DEVPAUSE ) /* 正常に一時停止状態になった場合 */
- {
- if( ret == 0 )
- {
- cdpstat = -abs( cdpstat ); /* cdpstatを負の値にする */
- #if CONSOLE
- printf("\n cdp_PAUSE!!\n\n");
- #endif
- }
- #if CONSOLE
- else
- { printf("\n すでに演奏中断しています\n"); }
- }
- else if( ret != 0 ) /* エラーの場合 */
- {
- printf(" cdp_pause エラーしました No.= 0x%x\n", ret);
- #endif
- }
- return( ret );
- }
-
- /* 演奏中断解除 */
- int cdp_cont()
- {
- int ret;
- ret = cdr_continue( devno );
- if( ret == 0 || ret == DEVNPAUSE || ret == DEVPLY )
- {
- cdpstat = abs( cdpstat ); /* cdpstatの値を正にする */
- #if CONSOLE
- if( ret == 0 )
- {
- printf("\n cdp_CONTinue!!\n\n");
- }
- else
- { printf("\n 既に解除されています\n"); }
- }
- else
- {
- printf(" cdp_cont エラーしました Error No. = 0x%x\n", ret);
- #endif
- }
- return( ret );
- }
-
- /* 演奏中断と解除 */
- int cdp_p_c()
- {
- int ret = -1;
- if( stat == 1 && cdpstat > 0 )
- { ret = cdp_pause(); }
- else if( cdpstat < 0 )
- { ret = cdp_cont(); }
- return( ret );
- }
-
- /* 演奏を次の曲に */
- int cdp_next()
- {
- int ret, a ,b;
- b = abs( cdpstat );
-
- if( stat == 1 ) { cdr_pause( devno ); }
-
- if( b == 10000 ) /* ディスク情報を未取得の場合 */
- {
- cdpstat = nowmusno;
- b = abs(cdpstat);
- cdp_diskinf();
- }
-
- if( cdtype == 3 && b == 0 )
- { /* DA-DATA共存ディスクでstop状態からコールされた時の処理 */
- a = 2;
- }
- else if( b < endtrk )
- { /* 次の曲に送る */
- a = b +1;
- }
- else if( b == endtrk )
- { /* 現在、最後の曲のときは先頭の曲にする */
- a = sttrk;
- }
- else /* 失敗 */
- {
- #if CONSOLE
- printf(" Song_num > Endtrk !!\n");
- #endif
- return(-1);
- }
- #if CONSOLE
- printf("\n cdp_NEXT() ! Next One => %d\n", a);
- #endif
- ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
- return( ret );
- }
-
- /* 演奏を前に戻す */
- int cdp_back()
- {
- int ret, a, b;
- b = abs( cdpstat );
-
- if( stat == 1 ) { cdr_pause( devno ); }
- if( b == 10000 ) /* ディスク情報を未取得の場合 */
- {
- cdpstat = nowmusno;
- b = abs(cdpstat);
- cdp_diskinf();
- }
-
- if( intrktim.sec < 2 && cdpstat > 0 )
- { /* 2秒以内演奏中のときは前の曲を指定する */
- if( sttrk < b )
- { a = b -1; }
- else if( sttrk == b )
- { /* 現在、最初の曲のときは最後の曲を指定する */
- a = endtrk;
- }
- }
- else if( sttrk <= b )
- { /* 曲の始めに戻す (曲途中・一時停止中) */
- a = b;
- }
- else if( b == 0 )
- { /* 停止中の場合は最後の曲を指定する */
- a = endtrk;
- }
- else
- {
- #if CONSOLE
- printf(" Error @ cdp_back() !!\n");
- #endif
- return(-1);
- }
- #if CONSOLE
- printf("\n cdp_BACK() ! Next One => %d\n", a);
- #endif
- ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
- return( ret );
- }
-
- /* 1曲の演奏が終わったら勝手に次の曲に設定を書き換える */
- int cdp_inf_next()
- {
- int ret = -1;
- ret = cdp_playinf();
-
- if( cdpstat <= 0 || cdpstat == 10000) /* 停止中だったら何もしない */
- { return( ret ); }
-
- if( stat == 0 || cdpstat != nowmusno ) /* 前の曲が終わった場合 */
- {
- ret = cdp_next(); /* 変数cdpstatはcdp_sstartで設定 */
- }
- return( ret );
- }
-